package com.edu.exam.enums.grading;

import com.edu.exam.enums.core.BaseEnum;

/**
 * 质量检查范围枚举
 *
 * 管理质量检查的范围分类，包括全面、部分、抽样、定向、随机等
 *
 * @author System
 * @version 1.0.0
 */
public enum QualityCheckScope implements BaseEnum {

    /**
     * 全面
     */
    FULL("FULL", "全面"),

    /**
     * 部分
     */
    PARTIAL("PARTIAL", "部分"),

    /**
     * 抽样
     */
    SAMPLING("SAMPLING", "抽样"),

    /**
     * 定向
     */
    TARGETED("TARGETED", "定向"),

    /**
     * 随机
     */
    RANDOM("RANDOM", "随机");

    private final String code;
    private final String description;

    QualityCheckScope(String code, String description) {
        this.code = code;
        this.description = description;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 获取枚举的JSON值（使用code）
     *
     * @return 枚举代码
     */
    public String getJsonValue() {
        return code;
    }

    /**
     * 从代码创建枚举实例
     *
     * @param code 枚举代码
     * @return 对应的枚举实例，如果代码无效则返回PARTIAL
     */
    public static QualityCheckScope fromCode(String code) {
        if (code == null || code.trim().isEmpty()) {
            return PARTIAL;
        }

        for (QualityCheckScope scope : values()) {
            if (scope.getCode().equals(code)) {
                return scope;
            }
        }
        return PARTIAL;
    }

    /**
     * 检查是否为完整检查
     *
     * @return true如果是完整检查
     */
    public boolean isComplete() {
        return this == FULL;
    }

    /**
     * 检查是否为部分检查
     *
     * @return true如果是部分检查
     */
    public boolean isPartial() {
        return this == PARTIAL || this == SAMPLING || this == TARGETED;
    }

    /**
     * 检查是否为选择性检查
     *
     * @return true如果是选择性检查
     */
    public boolean isSelective() {
        return this == SAMPLING || this == TARGETED || this == RANDOM;
    }

    /**
     * 检查是否需要策略性选择
     *
     * @return true如果需要策略性选择
     */
    public boolean requiresStrategy() {
        return this == SAMPLING || this == TARGETED;
    }

    /**
     * 获取检查范围的覆盖率
     * 数值越大覆盖率越高
     *
     * @return 覆盖率百分比（0-100）
     */
    public int getCoverageRate() {
        switch (this) {
            case FULL:
                return 100;  // 全面检查100%覆盖
            case PARTIAL:
                return 75;   // 部分检查约75%覆盖
            case TARGETED:
                return 50;   // 定向检查约50%覆盖
            case SAMPLING:
                return 25;   // 抽样检查约25%覆盖
            case RANDOM:
                return 30;   // 随机检查约30%覆盖
            default:
                return 0;
        }
    }

    /**
     * 获取资源消耗等级
     * 数值越大消耗资源越多
     *
     * @return 资源消耗等级
     */
    public int getResourceConsumption() {
        switch (this) {
            case RANDOM:
                return 1;   // 随机检查消耗最少
            case SAMPLING:
                return 2;   // 抽样检查
            case TARGETED:
                return 3;   // 定向检查
            case PARTIAL:
                return 4;   // 部分检查
            case FULL:
                return 5;   // 全面检查消耗最多
            default:
                return 0;
        }
    }
}